home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-10-02 | 73.8 KB | 2,696 lines |
- Introduction 1
-
- Preface 1
-
- Document Organization 1
-
- Conventions 2
-
- Getting Help 2
-
- Basic Information 3
-
- What is a script? 3
-
- What is a script used for? 3
-
- Character scripts 3
-
- Object scripts 4
-
- World script. 5
-
- Control script 5
-
- Magic Spells 5
-
- Game Initialization Script 6
-
- Dead and Resurrection 6
-
- Basic Script Elements 7
-
- Keywords 7
-
- Keywords Table 8
-
- Comments 8
-
- Numbers 9
-
- Tokens 9
-
- Variables 10
-
- Generic Variables (Local and Global) 10
-
- String Variables 10
-
- World Variables and Attributes 11
-
- Object Variables and Attributes 11
-
- Character Variables and Attributes 13
-
- Group Variables and Attributes 14
-
- Types of Scripts 15
-
- Introduction Script 15
-
- Character Script 16
-
- Object Script 17
-
- World Script 18
-
- Control Script 18
-
- Resurrection Script 18
-
- Writing Scripts 19
-
- Script Files 19
-
- Expressions and Assignments 20
-
- Function Table 21
-
- Statements 22
-
- Conditional Statements 22
-
- Flow Control Statements 23
-
- Flow control using if 23
-
- Flow control using on-goto 23
-
- Loop Control Statements 24
-
- The while statement 24
-
- The for statement 24
-
- The foreach statement 24
-
- Object Manipulation Statements 25
-
- Move and Copy 25
-
- Drop 25
-
- Output Statements 25
-
- Write and Writeln 25
-
- Display 26
-
- Input Statements 26
-
- Getstr and Getnum 26
-
- Select 26
-
- Going Places 26
-
- Animation 27
-
- Entering Doors 27
-
- Teleportation 27
-
- Advanced Topics 27
-
- Entry Points 27
-
- Calling A DOS program 28
-
- Creating New Types and Classes 29
-
- New Character Types 29
-
- New Character Classes 29
-
- New Object Types 30
-
- New Object Classes 30
-
- New Object Modifiers 31
-
- New World Types 32
-
- Shareware Opportunities 33
-
- Extending the magic system 33
-
- MS-DOS based extensions 33
-
- Writing a whole new system 34
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- D C - G A M E S
-
-
-
-
-
- Version 4.0
-
-
-
- SCRIPT LANGUAGE USER'S GUIDE
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 1995
-
-
-
-
-
- (c) DC Software, 1989-1995
-
- 7908 Kettlewood Court
-
- Plano TX 75025
-
- (214) 491-1579Introduction
-
- Preface
-
- One of the goals of the DCGAMES adventure and role-playing game
- building system is to provide an environment in which you can
- create adventure games without having to know anything about
- computer programming, and without having to maintain a zillion
- lists of cryptic numbers. If you want to draw a river, you just
- do it. If you want to create a dragon, just grab the right
- picture and do it. The idea is to have a large enough set of
- objects, characters, monsters and landscaping to allow you to
- concentrate on the story.
-
- While this works fine most of the time, it is almost inevitable
- that there will be a few things you need to do that I didn't
- think of, or which need to work slightly different. You may
- need a new type of character or object, or some new magic
- spells. Maybe the wizards are too wimpy or elves and dwarfs
- should not exist in your adventure.
-
- Most of the features in the DCGAMES system are handled by
- scripts. The script language is a simple yet powerful language
- that the game driver understands, and which control the behavior
- of most parts of the game system.
-
- The scripts are created using a standard text editor, and can be
- as simple or complex as you need them to be. While you can
- write a complete game without writing a single line of script, a
- small effort on your part to learn how to write script will
- result in significantly better games, since you can fine-tune
- your creation to work exactly the way you want it to work.
-
- Document Organization
-
- This manual is organized in several sections. The first one is
- an introduction to the elements of the DCGAMES system. It
- explains each of the building blocks used to create an
- adventure, and how (and why) you would want to customize them.
- Everyone should read this section!
-
- The second section is a Reference Manual, which is a list of the
- features of the script language in a logical order. You will
- need a printed copy of that section of the manual when you are
- actually writing a script.
-
- Conventions
-
- In this document, the following conventions are used:
-
- UPPER-CASE-WORDS
-
- represent tokens that have a specific value and are typed
- exactly as shown.
-
- italic-words
-
- are used when a new concept is being introduced, and the world
- in italics is the name of that concept. They are also used to
- indicate that you should be replace the word with an appropriate
- name or value.
-
- bold-words
-
- represent names or values that should be typed exactly as shown.
-
- text1 | text2
-
- items separated by a vertical bar (|) mean you get to choose one
- of them.
-
- [text1 ]
-
- items enclosed in square brackets are optional. If multiple
- items are listed, separated by a vertical bar, then you may
- choose one of them or none.
-
- { text1 | text2 }
-
- items enclosed in curly braces are NOT optional. You must
- select one of the items listed.
-
- ...
-
- three dots (ellipsis) indicate that the previous item can be
- repeated multiple times. If there is a limit to the number of
- times an item can be repeated, it will be indicated in a note
- near the area where the ellipsis were used.
-
- Getting Help
-
- Registered users of DCGAMES get free telephone assistance
- evenings and weekends. This assistance may range from
- explaining how a certain feature works to guidance in how to add
- a new feature. I might even write some specialized scripts for
- you (within reason).
-
- Non-registered users are welcome to call also. I will try to
- answer questions over the phone, but please keep your questions
- simple and organized. If you feel you can't afford to pay for
- the game, I've been known to accept a smaller amount or even
- waive the fee in exchange for some serious feed back or some
- outstanding artwork or sound recordings that I may incorporate
- into the shareware product.Basic Information
-
- Who should read this guide?
-
- You need to read this guide if you are already familiar with the
- DCGAMES system and are ready to extend or modify the system to
- suit a particular game's requierments.
-
- It is very important that you be familiar with the world builder
- program (DCWORLD) before you try to modify the scripts.
-
- What is a script?
-
- A script is a text file, created using a simple text editor (If
- you use a word processor, be sure to store the file in 'ASCII'
- or 'PLAIN TEXT' format).
-
- The script file contains the instructions that tell the game
- driver (DCPLAY program) how to handle most aspects of the game.
- The system includes a large number of predefined scripts to
- handle objects, characters, worlds, etc. You can modify these
- scripts to meet your game's individual requirements, and you can
- write whole new scripts to extend the number of options you have.
-
- The DCGAMES system includes a large set of predefined scripts
- which are used to handle your game. While these scripts are
- complete, you may want to modify them or write new scripts to
- handle your specific needs. The type of script you write depends
- on the aspect of the game that you want to control.
-
- The script language was designed to be easy to learn and use.
- The documentation was written specifically for people that have
- no prior exposure to programming, and the predefined scripts
- have extensive annotations to help you understand them and learn
- from them.
-
- A good thing to remember is that you cannot cause any damage
- through experimentation. The worst you can do is to make some
- changes to a script that prevent it from operating properly.
- All you have to do is retrieve a copy of the original script
- (which you saved before you modified the script, right? right!)
- or at worst, you can give me a call and I will help you fix it.
- Don't be afraid to try!
-
- What types of scripts are there?
-
- Every aspect of the game is controled by scripts to a large
- extent. These scripts call other scripts which in turn may call
- other scripts themselves.
-
- Control scripts
-
- The CONTROL script is called every time you click with the mouse
- or press a key on the keyboard. This script decides what action
- to take based on your input. Thus, while the default control
- script interprets the letter A to mean 'attack' and a click in
- the view area with the left mouse button to mean 'look-at', you
- can modify the complete interface to do whatever you want.
-
- The control script is also called every 'minute' of game play.
- Using the world builder you can specify how time flows in your
- game (# of moves per minute, # of minutes per hours, # of hours
- per day, # of days per month, # of months per year, current
- date, etc.). The game driver then invokes the control script to
- keep track of time and allow it to take time dependent actions.
-
- Game Initialization Script
-
- When the game first starts, the INITGAME script will be invoked.
- This script is used to present the game's story. You can use
- voice, music, graphics, text, animation, etc.
-
- Within this script you also have the chance to create and
- customize the player's character or even the whole party. The
- default character stored in record 0 of the statistics file
- (PLAYERS.DTA) will be used if you don't create one.
-
- Dead and Resurrection
-
- The RESURECT script is invoked whenever all members of the party
- die. In this script you have the chance to load a saved game,
- restart the game from the begining or even resurect the party
- members.
-
- The default resurection script will restore the party members a
- limited number of times by comparing the number of times they
- have been resurected with the current experience level. It then
- transports the party to the place where the game started.
-
- Remember that you can set the rules and do whatever you want.
- Some games I've seen will reduce an individual's experience as a
- penalty for resurection but leave them where they were. Others
- will teleport the party to a different location for resurection.
-
- Character scripts.
-
- When the control script determines that you want to interact
- with another character, it invokes the character's script to
- handle the interaction.
-
- Every character in your game has a character type that
- determines it's behaviour. The list of character types is
- defined in the DCCTOKEN.DAT file and the behaviour is handled by
- a script with the same name as the character type.
-
- DCGAMES includes a full set of character types with their
- respective scripts: Regular, Bartender, Beggar, Civilian,
- Guard, Healer, Merchant, Prisoner, Teller and Trainer.
-
- The behavior of these character types is described in detail in
- the DCGAMES Player's Guide. One of the best ways to become
- quickly familiar with the script language is to compare the
- description of the character type as documented in the Player's
- Guide with the actual script that makes the character behave
- that way.
-
- To create your own character types, you add the name of the
- character type to the list in DCCTOKEN.DAT and then create a
- script with that name to handle it's behaviour. If a name is
- longer than 8 characters, you use the first 8 characters for the
- script name.
-
- Note: individual characters can have their own individual script
- to override some or all of the character's standard behaviour.
- When a character has it's own script, the driver allows the
- character's script to handle the behaviour and invokes the
- default script for the character's type only if the individual
- script does not handle a particular action.
-
- Object scripts.
-
- When the control script determines that you want to use an
- object in some way, it invokes the object's script to handle the
- action.
-
- If the action is on an object you are carrying, the CURRITEM
- script is invoked. If the action is on an object you are not
- carrying, the OBJECT script is invoked.
-
- These two scripts handle the standard behaviour for all of the
- object types defined in DCCTOKEN.DAT. You can add new types to
- the list and modify these scripts to handle actions on the new
- object types.
-
- The default scritps handle Food, Weapon, Ammunition, Armor,
- Shield, Amulet, Ring, Potion, Scroll, Staff, Chest, Keys, Gems,
- Book, Gold Sack, Torch, Lantern, Rope, Hooks, Mirror, Sign,
- Vehicle, Thing, Door and Fence objects.
-
- You can also override an object's default behaviour by providing
- a tailor-made script for that particular object. Any action
- that is not handled by your script will be handed over to the
- default script for handling.
-
- You can alter the behavior of an object in several ways. You may
- modify the OBJECT.SCR to alter the way existing objects types
- work, or define new object types; You can also create a brand
- new script file to control the behavior of a specific object.
-
- World scripts.
-
- When the player enters or exists a world, the world's script is
- executed. The predefined script WORLDDEF.SCR is executed if you
- don't provide one of your own. The world's script can deny
- access to the world, or send the character to a different
- destination within the same world or in any other world.
-
- The file DCCTOKEN.DAT contains a list of world types (Outdoors,
- City, Town, Dungeon, Hideout, House, Castle, Arena, Haunted and
- End-Game) which you can modify at will.
-
- The world script handles entry and exit from each world, but
- other scripts are also involved. For example, the CONTROL
- script will generate random monsters only in OUTDOORS, DUNGEON
- and HAUNTED worlds. It also handles walking of the 'edge' of the
- world (if outdoors you wrap around to the other edge of the
- world, but in cities and towns you 'leave' the world).
-
- Magic Spells
-
- When you invoke magic by using an object, the OBJECT and
- CURRITEM scripts handle the action, but when a magic users
- 'casts' a spell, no object is involved, so a separate script is
- used. The CASTING script handles the casting of magic spells.
-
- For more information on magic, see the Player's Guide and the
- World Builder User's Guide.
-
- Basic Script Elements
-
- This section introduces the basic elements that form the script
- language. Just like in English you use words to build sentences,
- and those words are classified into verbs, adjectives, etc, so
- does the script language use a basic set of elements to build
- it's sentences.
-
- The script language contains the following basic elements:
- Keywords, Tokens, Constants, Variables, Structures, Statements,
- Functions, Procedures, Comments. Let's look at each one in turn.
-
- Keywords
-
- A keyword is a word that has a special meaning in the script
- language. You cannot change the spelling or meaning of the
- keyword, because the game system has a specific meaning for it
- and depends on that meaning.
-
- A primary keyword is equivalent to a verb in the English
- language. It indicates the action taking place. These keywords
- form the basis of the script language. For example, if, goto,
- write, etc.
-
- A secondary keyword exists only to complement a primary keyword,
- and has no meaning by itself. For example, the if primary
- keyword has four secondary keywords associated with itself,
- namely: then, elsif, else and endif.
-
- For example:
-
- if player.name = "Henry" and fighting then
-
- write("Go Away");
-
- endif;
-
-
-
- In the above line, the if and write keywords are primary,while
- then, and endif are secondary because they have a meaning only
- in relation to the if keyword. (Note that and is also a
- secondary keyword, but has nothing to do with if I didn't
- highlight it).
-
- A function keyword is used to examine or modify a system value.
- This is a value that has a meaning to the game system, but you
- can examine and sometimes modify it to change the way the system
- behaves.
-
- For example, if the keyword fighting in the previous example has
- a TRUE value if the game system is currently in combat mode (a
- fight is taking place), so the script displays the words 'Go
- Away' if the current player's name is Henry and you are fighting.
-
- Note that words such as player, npc, object, world,group, etc.,
- are called variables and their qualifiers (like player.name or
- world.landscape) are called attributes. These are covered
- elsewhere in this manual.
-
- The section Writing Scripts in this manual introduces most of
- the keywords using simple examples. A detailed description of
- each keyword can be found in the Script Language Reference Guide.
-
- List of Primary, Secondary and Function Keywords1
-
- Comments
-
- A comment is a sequence of characters beginning with the
- character '!'. The exclamation point tells the script language
- compiler that the text that follows is a comment and should be
- ignored. Comments are used to document your scripts so they are
- easier to understand.
-
- For example:
-
- ! This is a comment
-
- ! This is also a comment! All of it..
-
- !!! This is another comment.
-
-
-
- Note that all text following first ! is part of the comment,
- including any other ! character.
-
- Numbers
-
- Numbers are very important in DCGAMES.
-
- They are used extensively to identify the attributes of objects
- and characters. As a rule, numbers can be values between
- -2147483647 and 2147483647. While this is true for constants,
- when using numbers, you will usually have to restrict them to be
- within the range of values allowed for the purpose you are using
- the number for. For example, a ring object has an attribute
- called charges which holds the number of times the ring can be
- used. This attribute can have a value between 0 (no charges
- left) and 255. Trying to set the charges attribute to 500 will
- result in a warning message, and assign the maximum allowed
- value of 255. The range of values that an attribute can take are
- documented along with each attribute in the section entitled
- STRUCTURES further on in this chapter.
-
- Tokens
-
- When you write a script, you frequently need to examine and
- modify the attributes of objects and characters, or to perform
- different actions depending on the values of the same. While
- most of these attributes are numeric, you don't need to remember
- what each number means. Instead, tokens have been defined that
- represent the numeric values.
-
- In this document, tokens are shown in UPPER CASE. Any name
- shown in upper case letters can be considered to be a token.
-
- For example. The standard product includes a set of pre-defined
- object types such as FOOD, WEAPON, ARMOR, etc. The game uses a
- number to represent the object's type (0, 1, 2, 3, etc), but it
- would be difficult to remember that if you want to create a
- WEAPON, you need to set the object's type to 1. Thus, a token
- (namely WEAPON) can be used. A complete list of predefined
- tokens, their values and their usage can be found in the
- appendix.
-
- If you modify or extend the set of pre-defined element types,
- you will also add new tokens to the file DCCTOKEN.DAT, which
- associates the token name with the actual value it is going to
- represent. Once the name has been added to the file, you no
- longer have to remember what value you were using for your new
- 'type' or 'class' or whatever.
-
- Variables
-
- A variable is a name used to represent a value, just like a
- token, but the difference is that the variable holds a value,
- and the value can be modified. For example, an object could
- have a weight of 100, but you can change that value any time.
-
- Variables are shown in bold letters in this document. A
- variable may have more than one value associated with it (for
- example, an object has a name, a value, a weight, etc.). The
- values associated with the variable are called the attributes of
- the variable.
-
- The following paragraphs hold a complete list of all variables,
- their names, attributes, values and a brief description of the
- meaning of the associated value.
-
- Generic Variables (Local and Global)
-
- There are 2048 local variables, named L0 through L2047. They
- can hold values between -32768 and +32767. They are called
- local because they exist only during execution of the script.
- Once the script has been executed, any value you placed in them
- is lost.
-
- Every time a script starts execution, it's local variables are
- initialized to zero. These variables are used mostly for
- control purposes and to hold intermediate values.
-
-
-
- There are 2048 global variables, named G0 through G2047. These
- variables can hold values between -32768 and +32767. They are
- called global because they exist for the entire duration of the
- game. If you set one of these variables to a certain value, it
- will retain that value until you change it again. These
- variables are used to hold values that are important throughout
- the life of the game. For example, you might use one of these
- variables to indicate that a certain action has taken place.
- Other scripts could then check the value of the variable and
- take different actions depending on whether the action has taken
- place or not.
-
-
-
- String Variables
-
- There are 17 string variables, named S0 through S16. They are
- different from other variables in that they hold TEXT instead of
- numbers. They are also different in that they are used for some
- specific purposes, and so, are not "generic".
-
- Variable S0 can contain up to 255 characters. While you can use
- it for any purpose, it is also used to store any text that the
- player types during conversations, as well as other values. The
- getstr() script function asks the user to type something, and
- stores that value in this variable (among other things).
-
- Variables S1 through S16 can contain up to 64 characters. These
- variables hold the 16 lines of text associated with the current
- object or character. The loadtext() script function will load a
- given text record and place each of the lines in the
- corresponding variable.
-
- Character Variables and Attributes
-
-
-
- A character in the adventure can be a simple 'extra', with no
- other function than to flesh out a story, or it can be an
- integral part of it. Every character is controlled by a script,
- and the system includes a large number of predefined scripts to
- handle different types of characters. Amongst the different
- types of characters are: Regular, Bartender, Merchant, Civilian,
- Quester, Beggar, etc. Each of these character types has it's
- own script, and when you create a character, you will usually
- select one of these scripts to handle it's behavior. You may
- extend the functionality of each character type by modifying the
- scripts, or you can create brand new scripts to handle a brand
- new type of character. For those characters that are central to
- the story, you may even want to create a special script that
- handles their unique behavior.
-
-
-
- When referring to characters, you may talk about the player or
- the npc. In any interaction, the player is a member of the
- game player's party. The npc is the member with which the
- player is interacting.
-
- Character Attributes Description
-
- name Name of the character (15 characters max).
-
- index* For players, the order in the party. For npcs their
- location in the list of npcs.
-
- type Character Type: (0-255). See tokens in DCCTOKEN.DAT
- [Character Types]
-
- class Character Class (0-255). See tokens in DCCTOKEN.DAT
- [Character Class]
-
- block Tile # from the DCPEOPLE.nnn graphics blocks file used
- for this character
-
- block2 Alternate Tile # used in some instances (under script
- control only)
-
- picture Image file (0-999). If given, the file CPICTnnn.PCX
- contains the picture.
-
- voice Voice file (0-999). If given, the file VOICEnnn.RSP
- contains the voices.
-
- x Character's current horizontal location in the current world.
-
- y Character's current vertical locatioin in the current world.
-
- count For NPCs only, it's the # of npcs represented by the
- individual NPC.
-
- script Optional SCRIPT for this character. Uses the character
- type as default.
-
- text Optioinal text record (0-n).
-
- load/mload Current/Maximum load (how much weight can be
- carried)
-
- str/mstr Current/Normal strength
-
- aim/maim Current/Normal aim
-
- dex/mdex Current/Normal dexterity
-
- spd/mspd Current/Normal speed
-
- pwr/mpwr Current/Normal magical power points
-
- hp/mhp Current/Normal Hit Points
-
- iq/miq Current/Normal intelligence
-
- ac/mac Current/Normal Armor Class
-
- luk/mluk Current/Normal Luck
-
- chr/mchr Current/Normal Charisma
-
- exp Current experience points
-
- level Current character level
-
- poisoned Character is poisoned
-
- scared Character is scared
-
- paralyzed Character is paralyzed
-
- confused Character is confused
-
- invisible Character is invisible
-
- energy Current energy level (From food. See group.energy for
- energy from sleep).
-
- stats Character statistics record.
-
- v0 - v7 Extra variables to be used for any purpose you need.
-
- weapon Currently wielded weapon (if any)
-
- armor Currently worn armor (if any)
-
- shield Currently worn shield (if any)
-
- ring Currently worn ring (if any)
-
- amulet Currently worn amulet (if any)
-
- staff Currently wielded staff (if any)
-
- bp Currently selected backpack object (The backpack can hold
- 16)
-
- body Currently selected body object (if any, one of the
- following 6 objects).
-
-
-
- Object Variables and Attributes
-
-
-
- An object is an item that can be manipulated in many different
- ways during game play. The object's TYPE and CLASS determine
- what can be done with the object.
-
- Most of the behavior of objects is controlled from the
- predefined script OBJECT. This script can handle objects of
- type food, weapon, ammunition, shield, armor, ring, amulet,
- scroll, staff, chest, vehicles, etc.
-
- Object Variables Description
-
- player.weapon The weapon wielded by the current player (if
- any).
-
- player.armor The armor worn by the current player (if any).
-
- player.shield The shield being used by the current player (if
- any).
-
- player.ring The ring being worn by the current player (if any).
-
- player.amulet The amulet being worn by the current player (if
- any).
-
- player.staff The staff being used by the current player (if
- any).
-
- player.body The last selected body item (represents one of
- player.weapon, player.armor, player.shield, player.ring,
- player.amulet or player.staff.
-
- player.bp The last selected backpack item for the current
- player. The backpack can hold up to 16 items, but only one of
- them is selected at a time.
-
- npc.weapon The weapon wielded by the current npc (if any).
-
- npc.armor The armor worn by the current npc (if any).
-
- npc.shield The shield being used by the current npc (if any).
-
- npc.ring The ring being worn by the current npc (if any).
-
- npc.amulet The amulet being worn by the current npc (if any).
-
- npc.staff The staff being used by the current npc (if any).
-
- npc.body The last selected body item (represents one of
- npc.weapon, npc.armor, npc.shield, npc.ring, npc.amulet or
- npc.staff.
-
- npc.bp The last selected backpack item for the current npc.
- The backpack can hold up to 16 items, but only one of them is
- selected at a time.
-
- group.vehicle The vehicle the group is currently on (if any).
-
- object The object represented by this variable is not being
- carried by anyone. It exists on it's own in the current world.
-
- curritem The object represented by this variable is being
- carried by either the player or the npc character, either in the
- backpack or being worn. It is used when the exact location of
- the object is not important.
-
-
-
- Each of the objects listed above has the following attributes
- associated with it. Thus, you can type: npc.weapon.name,
- player.bp.count, group.vehicle.type, curritem.class, etc.
-
- Object Attributes Description
-
- name Name of the object (15 characters max).
-
- index* Current position of the object in it's place (world,
- backpack, etc.)
-
- type Object Type (0-255). See DCCTOKEN.DAT section [OBJECT
- TYPES]
-
- class Object Class (0-255). See DCCTOKEN.DAT sections [OBJECT
- CLASS: x, y]
-
- block Tile # from file DCOBJECT.mde used to display the object.
-
- picture Image file # (000-999). If given, file OPICTnnn.PCX
- contains the picture.
-
- voice Vioce file # (000-999). Objects can have a sound file
- also VOICEnnn.RSC
-
- weight Current weight of the object.
-
- value Current value of the object in Silver Pieces (10sp =
- 1gp).
-
- x Object's horizontal location (when not being carried).
-
- y Object's vertical location (when not being carried).
-
- count Number of objects represented by this single instance.
-
- script Optional script file. Uses OBJECT.SCR and CURRITEM.SCR
- by default.
-
- text Object's text record (if any).
-
- endgame For compatibility with DCGAMES 1.x/2.x.. 0=No, 1=on
- GET, 2=Give.
-
- endtext Text block # to be displayed when the game ends due to
- 'endgame'.
-
- v0 - v7 Extra attributes, use for anything you want.
-
- m0 - m4 Extra attributes, but you can have a token name
- associated with one of these. See file DCCTOKEN.DAT for more
- info.
-
-
-
- World Variables and Attributes
-
-
-
- Each world has a certain number of attributes which you can
- examine and in some cases modify. You can only access the
- attributes for the world you are currently in.
-
-
-
- Attribute Description
-
- name Name of the current world, text, 15 chars.
-
- index* Current world number.
-
- type World's type, 0 - 255. Tokens: OUTDOORS, CITY, TOWN,
- DUNGEON, HIDEOUT, HOUSE, CASTLE, ARENA and ENDGAME.
-
- x* Horizontal size (width) of the current world
-
- y* Vertical size (height) of the current world
-
- block(x,y) Landscaping block # displayed at position x,y
-
- density(x,y) Density of landscaping block at position x,y
-
- level Minimum player level needed to enter this world.
-
- landscape Landscaping file being used (0 to 9)
-
- door the door through which you entered the current world.
-
- doorx(door#) Horizontal location of the door in the current
- world.
-
- doory(door#) Vertical location of the door in the current
- world.
-
- destinationworld(door#) Destination world # .
-
- destinationdoor(door#) Destination door in the destination
- world. (non-trap doors only)
-
- destinationx(door#) Horizontal location in the destination
- world (trap doors only)
-
- destinationy(door#) Vertical location in the destination world
- (trap doors only)
-
- trapdoorswitch(door#) Is non-zero if the door is a TRAP
- (destinationx/y instead of destinationdoor).
-
- entrytext(door#) Text block # displayed when the player enters
- the world through the door.
-
- entrytextswitch(door#) If non-zero, the text is displayed only
- the first time the door is used.
-
- exittext(door#) Text block # displayed when the player exits
- the world through the door
-
- exittextswitch(door#) If non-zero, the text is displayed only
- the first time the door is used.
-
- edgedoor The door through which the player exits the current
- world by walking 'of-the-edge' of the world, or casting the
- standard 'exit' spell.
-
-
-
-
-
- Group Variables and Attributes
-
- Durng game play, your group can contain anywhere from 1 to 6
- characters.
-
- Group Attributes Description
-
- size* Current number of characters in the group.
-
- current Currently selected 'spokesbeing' for the group (0-5).
-
- gold Amount of gold being carried (given in silver pieces, 10sp
- = 1gp).
-
- food The total amount of normal (non-magical) food being
- carried by the party.
-
- energy The group's energy, which is replenished with sleep.
-
- dead_count Number of times that everyone in the group has died
- (and thus, how many times they have been resurrected).
-
- x Current horizontal location in the current world.
-
- y Current vertical location in the current world.
-
- moves Total number of moves since the game started.
-
- block Tile # from DCSYSTEM.mde (type 'SYS_PARTY') to represent
- the party during normal game play.
-
- vehicle Current vehicle (if any). If the group is riding a
- vehicle, the vehicle's graphics block is displayed instead of
- the group's regular block.
-
- Types of Scripts
-
- This section talks about the different TYPES of scripts you may
- want to write, and tries to point out WHY you would want to
- write that kind of script, instead of HOW. The actual script
- language is presented in the section Script Language Programming
- Guide later in this manual.
-
- Introduction Script
-
- The introduction script (INITGAME.SCR) is a script that is
- executed only the first time you start playing. Like most games,
- you must start of by telling the game player what the story is
- about, give some background information, set the mood for the
- game.
-
- Before this script is invoked, a group with a single player is
- created, taking the attributes from record 0 of the statistics
- file (PLAYERS.DTA) as created using the DCWORLD program.
-
- The INITGAME script is free to modify the default character, as
- well as add other characters to the group at this time. It can
- also invoke the edit_character function to allow the player to
- select a name, character type, character block and starting
- attributes.
-
- You can also modify the group's starting position by seting the
- X and Y attributes of the group variable, or by using the
- teleport or enter commands.
-
- A typical introductory script would look like this:
-
- !
-
- ! FILE : initgame.scr
-
- !
-
-
-
- readtext( "intro.txt" ); ! Read some text
-
- viewpcx ( "intro2" ); ! Show a nice picture
-
- music ( "intro2" ); ! Play background music
-
- wait ( 120 ); ! Wait until music ends or <SPACE> is
- pressed
-
-
-
- !
-
- ! Now, create the player's character by using 'edit_player'
-
- !
-
- edit_player( 1,
-
- 30, ! points to distribute
-
- 9, ! Minimum start attribute value is 9
-
- 25, ! Maximum start attribute value is 25
-
- 1, ! Allow name to be changed
-
- 0, ! Don't allow character class to be changed
-
- 1 ! Allow character image to be changed
-
- ); ! Allow all stats to be changed (strenght,
- dexterity, etc.)
-
-
-
- CONTINUE; ! Continue with normal character creation
-
-
-
- Note that the READTEXT command has some voice, music and
- graphics capabilities also. The 'intro.txt' file does not
- necessarily display a single page of text.
-
- Character Script
-
- Every character in the game has a script to control it's
- behavior, except for monsters (type HOSTILE), whose behavior
- consists of chasing the player and fighting.
-
- The world builder assumes that the first 8 characters of the
- character TYPE can be used as the name of the character's
- script. Thus a BARTENDER's script is BARTENDE.SCR, and a
- BEGGAR's script is BEGGAR.SCR.
-
- The system provides 11 predefined character scripts, each of
- which has a unique function. A full explanation of each
- character 'type' as implemented by the scripts can be found in
- the DCGAMES User's Guide.
-
- Usually, a character script handles conversation. When the
- player 'talks' to a character, the character takes control of
- the conversation by means of the script. A merchant, for
- example, asks if you wish to buy or sell something, while a
- healer asks if you need to be cured, healed, etc.
-
- Special characters may have their own unique script, as is the
- case of JIMMY in the example adventure. That script does a bit
- of animation when the character is asked to join the adventurer,
- and handles special needs of that character.
-
- You should print out the character scripts and compare each of
- them with the description of the character type as given in the
- User's Guide. You will then understand how the given script
- implements the behavior.
-
- There are three ways of working with character scripts. You can
- modify the default scripts to alter the behavior of existing
- character types, you can create a brand new character type, with
- it's own script, or you can create a unique script for a unique
- character.
-
- Object Script
-
- Unlike characters, objects are not requried to have a script
- associated with them. If they do have one associated, it is
- invoked first to allow it to handle the interaction. If the
- script does not handle the interaction, or it does handle it but
- ends with CONTINUE instead of STOP, or there is no script at
- all, the system invokes one of the default object handling
- scripts: OBJECT.SCR is invoked for objects laying around while
- CURRITEM.SCR is invoked for objects being carried by the player
- or npc.
-
- Every time you create a new object type or even a new class
- within an object type, you will need to modify the OBJECT and
- CURRITEM scripts to handle the new object. For example, mirrors
- currently don't do anything. If you wanted to have a mirror
- that shows you an area around you, you could create mirror
- classes. Class 0 would be a normal mirror, while class 1 would
- invoke a 'view' spell. You can then modify the two scripts to
- check the class attribute for mirrors and behave accordingly.
-
- Note: Since version 4.0 allows one script to call another, this
- description is not entirely correct. The CONTROL script calls
- the OBJECT or CURRITEM scripts as needed, and these scripts may
- call others, like the CASTING script or the DESCOBJ script.
-
- Now, if you need to have a given object behave differently, you
- need to write a separate script for it. The script does not
- need to handle all actions on that object, just the ones that
- are different. For example: You want to create a magic ring,
- but this ring can cast more than one spell. You could write a
- special script that has an entry point for the @WEAR action (see
- the programming guide section at the end of this document).
-
- When the character wears the ring, your script might display the
- image of a genie, and ask the player what spell is desired. The
- script would then perform the appropriate spell.
-
- Remember that if a script does not have an entry point for a
- given action, then a default action is taken. In this case, the
- default action is to call the CURRITEM script. Thus, all
- actions would be handled by the CURRITEM script except for WEAR.
-
- Remember also that if your script ends with CONTINUE instead of
- STOP, the default action is taken anyway, so your script doesn't
- really have to handle the situation. For example, your 'ring'
- may have a 'random' effect (i.e. you never know what is going to
- happen when you wear it). To do this, your script would just
- set the ring's class (which determines it's magical effect) and
- terminate with CONTINUE. The default action would be taken, and
- the CURRITEM script would handle the actual magical effect!World Script
-
- World scripts are executed whenever you ENTER or EXIT the world.
- The default world script, WORLDDEF.SCR, is invoked if your
- world does not have it's own script. The world type and other
- attributes configured using DCWORLD allow the WORLDDEF script to
- handle most normal situations.
-
- World scripts can be very powerful tools to introduce some
- amount of 'sequencing' into the game. From within a script you
- can change landscaping, doors, etc. You can also examine and
- change every single object and character in that world. You
- could have a character that exists only after you have performed
- a certain action. The world script could check to see if you
- have performed that action every time you enter the world, and
- create the character only when you have done so.
-
- You can even re-route the player to a different destination
- within the same world, or in a totally different one.
-
- See the comments in the WORLDDEF script for a detailed
- discussion of entering and exiting worlds.
-
- Control Script
-
- The control script is the most sensitive script of all. It is
- called under different circumstances and it invokes most of the
- other scripts itself as needed.
-
- This script is invoked:
-
- Every 'minute' of game play (as defined in the MovesPerMinute
- control variable) to keep track of time and handle healing,
- getting tired, resting, the appearance of random monsters, etc.
-
- Every time you press a key or click with the mouse to handle the
- interaction between the player and the game system.
-
- Once for every player during a fight, to handle a player's TURN.
-
- Once for every monster during a fight, to handle the monster's
- TURN.
-
- Note: Version 3.x had entry points in the control script for
- handling a player leaving the party, winning a fight (for
- experience and random treasure), etc. These entrypoints are no
- longer needed because version 4.0 is more fully under script
- control, so these events happen in their appropriate places
- without special "hooks".
-
- Resurrection Script
-
- The resurrection script (RESURECT.SCR) is called whenever all
- members of the playing party die. From this script you have the
- option to give the player a second chance. Once again, you have
- complete control over the situation. You can terminate the
- game, give the player the option to restart, restore or quit, or
- just restore the player's hit points and continue the game. You
- can also transport the party to another location, and perform
- some cleanup activities.
-
- Writing Scripts
-
- Script Files
-
- A script can be written using any regular text editor or word
- processor. If you use a word processor, you should save the
- script in ASCII or TEXT format (with no special controls like
- fonts or page formatting). The script file name should have an
- extension of .SCR, to indicate it contains a script.
-
- Once the script has been saved, you will use the script compiler
- to translate the script from human readable form (text) into a
- compact code that the game driver understands. The translated
- code is written into a file with the same name as the original
- file, but with extension of .SCO (for SCript Object).
-
- For example:
-
- C:\DCGAME> edit myscript.scr
-
- ... you create the script using some editor ...
-
- C:\DCGAME> dir myscript.*
-
-
-
- Volume in drive C is MYVOLUME
-
- Directory of C:\DCGGAME
-
-
-
- MYSCRIPT SCR 1208 10-29-92 1:25p
-
- 1 file(s) 1208 bytes
-
- 6920192 bytes free
-
-
-
- C:\DCGAME> dcc myscript
-
- DCGAMES Script Compiler Version 4.0, August 1995
-
- Copyright (c) 1992 DC Software, 7908 Kettlewood Court, Plano TX
- 75025
-
- Compiling Script <myscript.SCR>
-
- Code Size = 179
-
- Data Size = 367
-
- Labels = 25
-
- Compilation successful
-
-
-
- C:\DCGAME> dir myscript.*
-
-
-
- Volume in drive C is MYVOLUME
-
- Directory of C:\DCGGAME
-
-
-
- MYSCRIPT SCO 604 10-29-92 1:28p
-
- MYSCRIPT SCR 1208 10-29-92 1:25p
-
- 1 file(s) 1208 bytes
-
- 6920192 bytes free
-
-
-
- The script MYSCRIPT is now ready to be used in your adventure.
- Now, every script must be translated in the above manner
- whenever you modify it, or the changes will not be seen by the
- game driver. The game driver uses the .SCO file only.
-
- To compile ALL the scripts in your current directory, type:
-
- C:\DCGAME> for %i in (*.scr) do dcc %i
-
- If you are familiar with any programming language at all, the
- script language will be quite easy to learn, but even if you
- have never learned any programming language, you should be able
- to learn how to write scripts without to much trouble.
-
- To assist you, the following section sections try to present the
- script language in easy incremental steps, so you may learn at
- your own pace.
-
- If you get hopelessly lost, give me a call and I will try to
- assist over the phone, but please give it your best shot and try
- to have specific questions written down when you call. It will
- help keep the phone call as short as possible.
-
- I urge you to annotate this document wherever you see think
- something being presented poorly, in the wrong order, or just
- plain wrong. This section is the most important one because it
- is the one that enables YOU to write your games. Send me a copy
- of the pages on which you have made notes and I will gladly
- correct the problem and send you back a new copy with
- corrections as soon as they are made.
-
- Expressions and Assignments
-
- An expression is a list of one or more symbols that represent a
- single value. The symbols may be variables, attributes,
- constants, functions or operands. We already know what
- variables, attributes and constants are. An operand is a symbol
- that tells the computer that an operation should take place.
- For example, in the expression 3 * 5 + 2, the * operand tells
- the computer to multiply the constants 3 and 5, and the symbol +
- tells the computer to add two values together..
-
- In DCGAMES there are 3 types of expressions, arithmetic,
- relational.
-
- An arithmetic expression is one which takes numeric values (from
- variables, attributes, constant or functions) and performs an
- arithmetic operation on them. The arithmetic operands are: *,
- /, +, - and % (this last representing a modulo operation, or the
- 'remainder' portion of an integer division).
-
- A relational expression is one which compares two numerical
- expressions and results in a logical value (to be specific, a
- relational expression will always result in either a zero or a
- one).
-
- A logical value is either zero (meaning FALSE) or non-zero
- meaning true.
-
- Expressions are used in many places, but the most common use of
- expressions is on the right side of an assignment statement.
- The second most common use for expressions is as part of a flow
- control statement, such as if or on, which are examined a bit
- later.
-
- Note that the function keywords listedat the begining of this
- document can be used almost anywhere that you can use an
- expresion. A function has a value which is replaced in the
- position that you use the function itself. It also may have
- parameters that change the value of the function itself.
-
- For example, the function abs( - 3 ) has a value of 3, while the
- function max(-5,7,2) has a value of 7.
-
- This table presents a more detailed description of the
- functions, but a detailed explanation of each of them is found
- in the Script Language Reference Manual.
-
- Function Table
-
- Function Description
-
- General General purpose functions
-
- abs(expr) Returns the value of the expression without a sign
- (removes negative signs)
-
- adjustments(expr,...) Returns the sum of the attribute
- adjustments indicated by the expressions
-
- find(where,what,type) Find an object or character
-
- getnum(str,low,high) Display a message and get a value between
- low and high from the player.
-
- getstr(str,...) Get a string from the player and return the
- index of the matching one.
-
- locate(what) Locate an object or npc character by allowing the
- player to point to it.
-
- Time Related Used to control time during game play
-
- MovesPerMinute Number of moves that can be made in one minute
- of game play.
-
- MinutesInAnHour Number of minutes in one hour of game play.
-
- HoursInADay Number of hours in a day of game play.
-
- DaysInAMonth Number of days in a month of game play.
-
- MonthsInAYear Number of months in a year of game play.
-
- Year The current year.
-
- Month The current month of the current year.
-
- Day The current day of the current month.
-
- Hour The current hour of the current day.
-
- Minute The current minute of the current hour.
-
- SunRise The hour of the day at which the sun rises
-
- SunSet The hour of the day at which the sun sets
-
- Monster Related Used to create random monsters
-
- DefStat(0-2) Backpacks that contain likely treasure (usually
- Potions, Rings and Staffs).
-
- DefPack(0-3) The statistics records for SMALL, MEDIUM, LARGE
- and PIRATE monsters.
-
- DefLandBlk(0-4) Graphics blocks for land based monsters
- (ordered, 0=Easy,4=Very Hard)
-
- DefCaveBlk(0-4) Graphics blocks for cave dwelling monsters
- (ordered)
-
- DefWaterBlk(0-4) Graphics blocks for water dwelling monsters.
- (ordered, 4=Pirate Ship)
-
- DefSpookBlk(0-4) Graphics blocks of skeletons, ghosts, etc.
- (ordered)
-
- expr represents any expression that results in a numeric value
-
- ... means that any number of the preceding may be listed,
- separated by commas (up to 255 maximum)
-
- The numeric range (0-N) means that a value in the given range
- must be provided when referring to this variable
-
-
-
- Examples:
-
- ! Increase a player's current level
-
- player.level = player.level + 1;
-
- ! same as "inc(player.level);"
-
-
-
- ! When selling an object, increase the group's gold by half the
- value of the object.
-
- group.gold = group.gold - player.bp.value / 2;
-
- ! same as "dec( group.gold,player.bp.value/2);"
-
-
-
- ! Compute the amount of damage done by a weapon, taking into
- account the wielder's
-
- ! strength (assumes this is not a missile weapon), where
- strength is not important.
-
- L25 = npc.weapon.damage + adjustments(npc.str);
-
-
-
- ! NOTE: Since relational expressions return 0 if false and 1 if
- true, the following
-
- ! expression returns a value between 0 and 7, which is the
- number of attributes
-
- ! of the current npc that exceed 25 points.
-
- L7 = npc.str > 25 + npc.aim > 25 + npc.dex > 25 + npc.spd > 25 +
-
- npc.pwr > 25 + npc.iq > 25 + npc.chr > 25 + npc.luk > 25;
-
-
-
- ! Change the character's name to "Henry"
-
- player.name = "Henry";
-
-
-
- Please note that the last assignment statement assigns a string
- value to the name attribute. The name and script attributes may
- only hold string values.
-
- Statements
-
- Just like the English language, the script language uses words
- and symbols to build sentences or statements which tell the game
- driver what to do. A statement is a complete sequence of words
- and symbols that tell the game driver how to perform a single
- given action.
-
- A complex statement consists of a one or more statements that
- are grouped together in some fashion to create a more complex
- one. You are already acquainted with the assignment statement,
- now let's look at some other ones, grouped by their nature or
- intended usage.
-
- Conditional Statements
-
- In most cases, rather than just assign values to variables, what
- you want to do is take different action depending on certain
- conditions:
-
- ! Compute the amount of damage done by a weapon, taking into
- account the wielder's
-
- ! strength IF the weapon is a contact weapon (i.e. not a missile
- weapon).
-
- if npc.weapon.class = BLUNT or npc.weapon.class = EDGED then
-
- L25 = npc.weapon.damage + adjustments(npc.str);
-
- else
-
- L25 = npc.weapon.damage; ! No adjustment for strength
-
- endif;
-
-
-
- ! The above might also be accomplished as follows
-
- L25 = npc.weapon.damage;
-
- if npc.weapon.class = BLUNT or npc.weapon.class = EDGED then
-
- L25 = L25 + adjustments(npc.str);
-
- endif;
-
-
-
- ! Now, the following statement displays the current health
- status of a player
-
- if player.hp = 0 then
-
- writeln( player.name, " is dead!" );
-
- elsif player.hp = 1 then
-
- writeln( player.name, " is unconscious" );
-
- elsif player.hp < player.mhp
-
- writeln( player.name, " is hurt, but still able to function" );
-
- else
-
- writeln( player.name, " is healthy" );
-
- endif;
-
-
-
- Flow Control Statements
-
- Sometimes, the if statement can result in long and difficult to
- read statements. In some cases, it is more appropriate to use
- one of the various forms of the goto or gosub statements to
- accomplish the same goal.
-
- In order to use these statements, you must first declare one or
- more labels to which the flow of the execution may be
- transferred. The following examples are equivalent.
-
- Flow control using if
-
- :AGAIN
-
- L3 = getstr( "Sell", "Buy", "Talk" );
-
- if L3 = 0 then
-
- ! script for selling goes here
-
- elsif L3 = 1 then
-
- ! script for buying goes here
-
- elsif L3 = 2 then
-
- ! script for talking goes here
-
- else
-
- writeln( "What did you say?" );
-
- endif;
-
- goto AGAIN; ! do it again and again, forever.
-
-
-
- Flow control using on-goto
-
- :AGAIN
-
- L3 = getstr( "Sell", "Buy", "Talk" );
-
- on L3 goto XSELL, XBUY, XTALK;
-
- writeln( "What did you say?" );
-
- goto AGAIN;
-
- :XSELL
-
- ! script for selling goes here
-
- goto AGAIN;
-
- :XBUY
-
- ! script for buying goes here
-
- goto AGAIN;
-
- :XTALK
-
- ! script for talking goes here
-
- goto AGAIN;
-
-
-
- When a script is large, a single if statement may be several
- pages long. It is easy to loose track of what you were trying
- to accomplish. The on-goto statement has the advantage of
- breaking the logic into separate sections, each self contained
- and self explanatory. A more complete analysis of the goto,
- gosub, on-goto and on-gosub statements can be found in the
- reference guide.
-
- Loop Control Statements
-
- Whenever you need to perform the same operation multiple times,
- a loop statement may come in handy. The following code shows a
- player giving a copy of everything in his/her backpack to the
- npc character:
-
- L6 = 0; ! Start with the first backpack object;
-
- :DOIT
-
- setbp(player.bp, L6); ! Select the Nth backpack object
-
- if player.bp.count then ! If count non-zero, there is an object
-
- copy(player.bp,npc); ! Give a copy of the object
-
- endif;
-
- inc( L6 ); ! Same as L6 = L6 + 1;
-
- if L6 < 16 goto DOIT; ! Repeat 16 times
-
-
-
- The above code uses the goto statement to create a loop that
- examines the 16 backpack locations for an object and then copies
- the objects (if they exist) to the npc.
-
- The while statement
-
- The while statement simplifies loops by providing an easy way of
- defining a loop without having to declare a label or writing an
- IF statement. Note that the test for L6 < 16 is made before the
- statements inside the loop are executed.
-
- L6 = 0;
-
- while L6 < 16 do
-
- setbp( player.bp, L6 );
-
- if player.bp.count then
-
- copy( player.bp, npc );
-
- endif;
-
- inc( L6 );
-
- endwhile;
-
-
-
- The for statement
-
- The for statement simplifies the loop even more by allowing you
- to specify both the initial value, the final value and the
- amount by which the control variable (L6) is to be incremented
- (or decremented). Thus, the loop becomes:
-
- for L6 = 0 to 15 do
-
- setbp( player.bp, L6 );
-
- if player.bp.count then
-
- copy( player.bp, npc );
-
- endif;
-
- endfor;
-
-
-
- The foreach statement
-
- To top it of, the foreach statement allows you to select in
- sequence every element of a group. In this case, the group is
- the set of objects in the backpack. The foreach loop is
- executed once for each element in the player's backpack. Empty
- slots are not even selected, so no test is needed.
-
- Note that if the backpack has NO elements, then the statements
- inside the loop not executed. This is the best way of examining
- all the elements of a group.
-
- foreach player.bp do
-
- copy( player.bp, npc );
-
- endfor;
-
-
-
- The foreach statement can select: a) All the characters in the
- player's group, b) All the objects in a character's backpack, c)
- All the objects a character is wearing, d) All the character's
- in the current world (but not in the player's group) and e) All
- the objects in the current world (but not in anyone's backpack).
-
- Object Manipulation Statements
-
- As you saw in the examples above, sometimes you want to move or
- copy objects from one place to another.
-
- Move and Copy
-
- When you move an object, it is removed from it's current place
- and inserted in the destination, as long as the destination has
- enough room for it. If there is not enough room or the
- destination character cannot carry the object, the object is not
- moved.
-
- The copy statement works the same way, but does not delete the
- object from the source, thus making a copy instead of moving the
- object.
-
- In both cases, you can specify how many objects you want to
- move. The command will move as many as the destination can
- possibly hold. If you specify that you want to move or copy
- more objects than are available in the source, additional
- objects are created.
-
- Drop
-
- When you drop an object, it is added to the list of objects in
- the world that you are in. The object will remain where you put
- it. There are no temporary objects in DCGAMES.
-
- Output Statements
-
- Write and Writeln
-
- When you want to display a value, you have several ways of doing
- it. The most simple one is the write or writeln statement.
- With this statement you can display all attributes and variables
- as well as text.
-
- The following example displays the time of day in the text
- window (assuming that the day has an even number of hours).
-
- if hour < HoursInADay / 2 + 1 then
-
- writeln( "The time is ", Hour, ":", Minute, "am" );
-
- else
-
- L7 = Hour - HoursInADay / 2;
-
- writeln( "The time is ", L7, ":", Minute, "pm" );
-
- endif;
-
-
-
- Display
-
- The display statement will show a list of items in the menu
- window, with or without numbers or values associated with it.
- It is useful when you need to show a list of items but are not
- requesting user input. The many forms of the display statement
- are documented in the reference guide.
-
- Input Statements
-
- Frequently, when you display something you are asking the player
- for directions; During a conversation, you ask the player what
- they want to talk about; A merchant might display a list of
- items and ask which you want to buy.
-
- Getstr and Getnum
-
- The getstr and getnum functions both return a number. The
- getstr function asks the user to type a string and searches the
- list of strings you provided. If a match is found, the command
- returns the index of the matching string (i.e. which one
- matched). If no match is found, the function returns a -1. In
- any case, the string is stored in the string variable s0.
-
- The getnum function displays a string and asks the user to enter
- a value in a given range. Only values in the range are allowed.
- If the user presses Esc instead of typing a number, the
- function returns -1.
-
- Select
-
- The select function displays a menu identical to the one
- displayed by display, but allows the user to select one of the
- entries by using the arrow keys. This function is used
- extensively, and you should study it with care in the reference
- guide.
-
- Going Places
-
- There are several ways in which characters and objects may move
- under script control.
-
- Animation
-
- All characters and any object that is not being carried by a
- character has a location within the world reflected by the x and
- y attributes of that character or object. From a script you may
- modify these attributes and effectively move the characters or
- objects within the limits of the world they are in. You can
- also change the block attribute to provide some additional
- visual feed back (as long as the character is on screen).
-
- A small example of animation is presented in the JIMMY.SCR file
- in the example game. When asked to join the party, Jimmy will
- walk over to his chest and retrieve his weapons, armor and
- money. He will then walk back towards the player and join the
- party.
-
- Automatic animation WILL be eventually handled by the system, so
- don't go writing animation routines for every character in your
- game. This kind of animation should be used in specific
- instances where you want things to happen that the user must not
- be able to prevent or should not have to do him/herself.
-
- Entering Doors
-
- The player's party may move from one location to another in
- several ways. The simplest one is to use the Enter command to
- enter a door. The party will be transferred to the world and
- destination that the door leads to.
-
- NOTE: The party will NOT be transferred to the new location
- until the script finishes execution.
-
- Teleportation
-
- If you wish to transfer the player to a specific world, you may
- use the Teleport command. This command allows you to specify a
- destination world (by number) as well as either a door in the
- destination world through which you wish to enter, or the actual
- x and y location at which the party should appear. Thus, a door
- need not be present in the destination world.
-
- Advanced Topics
-
- Entry Points
-
- Whenever a script is invoked, execution of the script will begin
- at a special label which is called an Entry Point. The entry
- points are labels of the form :@# where # is a number between 0
- and 20, but, to make life easier, the labels have specific names
- associated with them, which make it easier to remember them.
- The entry points and the names associated with them are
- different for each type of script, and are shown below: You
- should use the name form of the entry points unless you have a
- very good reason for using the numbers.
-
- For Character Scripts
-
- @TALK (0) - Talk to the character
-
- @DROP (2) - Character is being asked to leave the party
-
- @CAST (11) - Character will try to cast a given spell.
-
- For Object Scripts
-
- @TALK (0) - Talk to an object.
-
- @GET (1) - Move an object into the player's backpack.
-
- @DROP (2) - Drop an object being carried.
-
- @WEAR (3) - Wear an object.
-
- @REMOVE (4) - Remove an object being worn.
-
- @LOOK (5) - Look at an object.
-
- @EXAMINE (6) - Examine an object carefully.
-
- @INVOKE (7) - Invoke the magic in a magical object (ring,
- amulet, etc)
-
- @USE (9) - Use a generic object for whatever purpose it is
- intended.
-
- @EXIT (10) - The player's party wants to get out of a vehicle.
-
- For World Scripts
-
- @ENTER (9) - The player's party is entering the current world
-
- @EXIT (10) - The player's party is leaving the current world
-
- For Control Scripts
-
- n/a (0) - Time Control Entry Point.
-
- n/a (1) - Party wants to rest for the night.
-
- n/a (2) - A member of the party wants to leave the group.
-
- For Magic Spells
-
- @CAST (11) - A magic user has casts a spell.
-
- For Game Initialization
-
- n/a (0) - Invoked at game initialization
-
- For Dead and Resurrection
-
- n/a (0) - Invoked when everyone in the party dies.
-
- Calling A DOS program
-
- From within a script, you may execute a DOS program by using the
- system command. This command works exactly like the writeln
- command, except that instead of sending a line of text to the
- text window, the text is formed into an MS-DOS command and
- executed. When the command ends execution, the MS-DOS error
- level is stored in the failure variable. A value of 0 usually
- indicates success.
-
- See the reference guide entry for additional information.
-
- Creating New Types and Classes
-
- When the current types and classes of characters, objects or
- worlds is not enough, you may create your own types and classes
- as needed. The procedure for doing this is highlighted here,
- the assumption is made that you have read the manuals and are
- familiar with the script language before you attempt to add a
- new type or class.
-
- New Character Types
-
- To create a new character type, you should edit the file
- DCCTOKEN.DAT, look for the section [CHARACTER TYPES and add an
- entry after the last character type in the file:
-
-
-
- [CHARACTER TYPES]
-
- REGULAR 0 ! REGULAR.SCR - Will join the party if asked
- to..
-
- HOSTILE 1 ! HOSTILE.SCR - Will attack on sight and
- follow you..
-
- MERCHANT 2 ! MERCHANT.SCR - Buys and Sells stuff..
-
- BARTENDER 3 ! BARTENDE.SCR - Sells beer. Good source of
- information.
-
- HEALER 4 ! HEALER.SCR - Cure, Heal, Resurrect, Remove
- Curse,..
-
- CIVILIAN 5 ! CIVILIAN.SCR - Will talk, but won't join..
-
- TELLER 6 ! TELLER.SCR - Fortune Teller or Oracle
- type..
-
- QUESTER 7 ! QUESTER.SCR - Asks you to find an object or
- person.
-
- BEGGAR 8 ! BEGGAR.SCR - Want's money. Might give you
- a tip.
-
- TRAINER 9 ! TRAINER.SCR - Will train someone
- (STR,DEX,AIM,IQ)
-
- GUARD 10 ! GUARD.SCR - Blocks your way unless given
- the password.
-
- PRISONER 11 ! PRISONER.SCR - Will join your party
- temporarily (to escape).
-
- LAWYER 12
-
- In the above segment, the new character type LAWYER has number
- 12 assigned to it (the next available number). You may now
- write a script file called LAWYER.SCR to handle the default
- behaviour of lawyers.
-
- New Character Classes
-
- Character classes in the current implementation apply only to
- characters that join the party. The class of the character is
- used to determine what kind of weapons and armor they can use,
- what kind of magic they have, how fast they recover, etc.
-
- To create a new character class, just edit the DCCTOKEN.DAT file
- and add the new class to the [CHARACTER CLASSES] section:
-
-
-
- [CHARACTER CLASSES]
-
- HUMAN 0 ! standard stuff, no power
-
- ELF 1 ! fast, magical power, not strong
-
- DWARF 2 ! slow, STRONG, no magic, no missiles or
- shields
-
- WIZARD 3 ! slow, lot's of magic, not strong
-
- ARCHER 4 ! fast, no magic, + on missile weapons
-
- FIGHTER 5 ! fast, strong, no magic of any kind
-
- THIEF 6
-
-
-
- In the above segment, the new character class THIEF has a number
- 6 (next available one).
-
- The DCBLOCK, DCWORLD, DCPLAY and DCREPORT programs will now
- recognize thieves as a valid character type.
-
- You may also want to modify the OBJECT and CASTING scripts to
- give a thief certain advantages when dealing with traps, and to
- enable or restrict the kinds of weapons, magic, etc, that the
- character can handle.
-
- New Object Types
-
- Creating a new object type is again started by adding the new
- type to the DCCTOKEN.DAT file. The section [OBJECT TYPES]
- contains the names and numbers for all object types.
-
- Unlike characters, a single script handles all object types and
- classes. The OBJECT script should be extended to handle the new
- object type for all it's entry points.
-
- The object types Food, Weapon, Armor, Shield, Amulet, Ring and
- Staff have special treatment because they can be worn by the
- characters. The Vehicle object type also has special handling
- because it can be used for transportation. Other than these
- special handling, you can modify the OBJECT script file as much
- as you want.
-
- New Object Classes
-
- An object class is also represented by a section in the
- DCCTOKEN.DAT file. It is different from other sections in that
- multiple object types may have the same class (for example:
- rings, amulets, food, potions and gems all have the same class
- set).
-
- If your new object is going to have the same set of class items
- that already exists for another type, just add the name to the
- list, for example:
-
- !
-
- ! Magical Effects, Type 1
-
- !
-
- [OBJECT CLASS: FOOD, POTION, RING, AMULET, GEMS, WIDGET]
-
- NONE 0 ! No magical effect
-
- CURE 1 ! Remove POISON
-
- HEAL 2 ! Restore some HP
-
- POISON 3 ! (Trap) POISON drinker
-
- RESTORE 4 ! Restore ALL HP
-
- PLUS_STR 5 ! Increase STRENGTH
-
- PLUS_DEX 6 ! Increase DEXTERITY
-
- PLUS_SPD 7 ! Increase SPEED
-
- PLUS_AIM 8 ! Increase AIM
-
- PLUS_AC 9 ! Increase AC
-
- PLUS_HP 10 ! Increase HP
-
- PLUS_IQ 11 ! Increase IQ
-
- PLUS_PWR 12 ! Increase POWER
-
- Here, we have added the new object type WIDGET to the set of
- objects that have personal magic.
-
- You still have to modify the OBJECT script to handle the
- object's class. For example,
-
-
-
- on object.type goto
-
- USE_FOOD, USE_WEAPON, USE_AMMO, USE_ARMOR,
- USE_SHIELD,
-
- USE_AMULET, USE_RING, USE_POTION, USE_SCROLL,
- USE_STAFF,
-
- USE_CHEST, USE_KEYS, USE_GEMS, USE_BOOK,
- USE_GOLDSACK,
-
- USE_TORCH, USE_LANTERN, USE_ROPE, USE_HOOKS,
- USE_MIRROR,
-
- USE_SIGN, USE_VEHICLE, USE_WIDGET;
-
- .
-
- .
-
- .
-
- :USE_AMULET
-
- :USE_RING
-
- :USE_ARMOR
-
- :USE_WEAPON
-
- :USE_SHIELD
-
- :USE_STAFF
-
- writeln( "You must first 'get' it, then 'wear' or 'wield'
- it.." );
-
- STOP;
-
- :USE_WIDGET
-
- writeln( "If you want to use it, you must first 'get' it.."
- );
-
- STOP;
-
- .
-
- .
-
- Here, we have decided that a WIDGET must be in the player's
- backpack before it can be used.
-
- If your new object is different from all other objects, you can
- create a brand new section for it's classes in the DCCTOKEN.DAT
- file:
-
- !
-
- ! My WIDGET object classes
-
- !
-
- [OBJECT CLASS: widget]
-
- ROUND 0 ! A round widget
-
- SQUARE 1 ! A square widget
-
- OVAL 2 ! An oval widget
-
- At this point, you may create graphics blocks with type widget
- and class round, square or oval. You may also write script code
- like this:
-
- if object.type = widget then
-
- on object.class goto XROUND, XSQUARE, XOVAL;
-
- writeln( "Unknown widget class.." );
-
- stop;
-
- endif;
-
- :XROUND ! Handle a round widget
-
- ....
-
- STOP;
-
- :XSQUARE ! Handle a square widget
-
- ....
-
- STOP;
-
- :XOVAL ! Handle an oval widget
-
- ....
-
- STOP;
-
- New Object Modifiers
-
- Each object has 5 attributes that can be used to implement it's
- differences from other objects. These attributes have names m0
- through m4, but the object modifiers section in the DCCTOKEN.DAT
- file allows you to call them by other names.
-
- When you create a new object type and/or class, you may want to
- create new names for those fields that you might use to
- differentiate between them For example:
-
- [OBJECT MODIFIERS]
-
-
-
- ! Object Type: FOOD
-
- ! 0 Is not used
-
- UNITS 1 ! If magical, how many units are affected
-
- PERMANENT 2 ! If magical, how long does effect last? (0=one
- day, 1=permanent)
-
- ! 3 Is not used
-
- ! 4 Is not used
-
-
-
- ! Object Type: WEAPON
-
- HANDS 0 ! # of hands needed to use the weapon
-
- RANGE 1 ! Range of this weapon
-
- DAMAGE 2 ! Damage done when using this weapon.
-
- AMMONEEDED 3 ! Type of ammunition needed (See AMMOTYPE below..)
-
- ! 4 Is not used
-
-
-
- ! Object Type: WIDGET
-
- SIDES 0 ! # of sides that the widget has
-
- RANGE 1 ! Range of this widget
-
-
-
- Note that if you want to use a token that already has a value
- assigned, like range in the example, which has a value 1
- assigned for weapons, you MUST use the same value for the token.
- Tokens are replaced by their numeric value during compilation,
- so the following two lines are equivalent:
-
- if object.hands = 7 then ...
-
- if object.sides = 7 then ...
-
-
-
- Both lines are comparing the m0 modifier of the object with the
- value 7. The type of the object is not checked to see that the
- token you are using belongs to the object's type.
-
- New World Types
-
- Perhaps the easiest to create would be a new world type. Again,
- just add the entry to the DCCTOKEN.DAT file, section world
- types, and then edit the WORLDDEF script file to handle the new
- world type.
-
- Note that many of the currently defined world types have no
- actual differences between them. For example, Cities, Towns,
- Hideouts, Houses and Castles are all the same.. You can change
- that by modifying the appropriate scripts.
-
- For example: If you want to make opening a locked chest a crime
- in Castles and Houses, you can add a check in the OBJECT script
- to verify the type of world you are in when the character tries
- to break a lock.
-
- Shareware Opportunities
-
- While most users will use the script language to make small
- changes to the game system, with a few customized scripts to
- handle special characters or objects, the true power of scripts
- lies in the ability to completely change the way everything
- works. Here are a few example of some more complex projects
- that you may want to attempt once you are comfortable writing
- scripts:
-
- Extending the magic system
-
-
-
- The current magic system allows a character to cast a spell if
- it has the required number of power points. There is no
- requirement to learn the spells, or to be at a certain level
- before you can cast it. You can change the OBJECT and CASTING
- scripts to handle a magic book, which can be either a class of
- book (currently, books don't have classes) or a whole new type
- of object (Magic Book).
-
- You can also change the scripts to handle a lot more spells (up
- to 255 of each type), or add a level requirement for each spell.
-
- MS-DOS based extensions
-
- The system command allows you to run DOS programs from within a
- script. The following DOS programs could be called from a
- script to extend the functionality of the system. Writing these
- extensions requires knowledge about internal structures of the
- game files, which I will be glad to provide on a case by case
- basis.
-
- Save/Restore/Restart
-
- Replace the prompts that perform this function with a window
- that shows saved games along with comments and let's you choose
- which one you want to restore, or lets you specify which slot
- you want to save in, and what comment you want to associate with
- the saved game.
-
- Character Editor
-
- Allows you to examine/modify (i.e. cheat) the PARTY file.
-
- Arcade/Casino extensions
-
- A completely separate sub-game that is executed when you enter a
- world. For example, when you enter a casino, you can run a DOS
- game that allows the user to play poker or some other games in
- order to make money. The program may read the PARTY file to get
- the names of the characters and the amount of gold they have.
- It would update the gold amount when the characters leave the
- casino.
-
- Stand Alone Utilities
-
- A nice utility would be one that can take the game and create
- PCX graphics files for each world, optionally including the
- objects and characters that appear in it. The PCX file can then
- be scaled and manipulated by other utilities to print maps or
- include the graphics in documentation.
-
- Writing a whole new system
-
- It is perfectly feasible to take the rules, character types,
- magic system, etc of game systems such as Dungeons and Dragonstm
- or Man, Myth and Magictm and write them as scripts. You would
- have to throw away all of the current scripts and write them
- from scratch, but it's perfectly feasible. Of course, these
- systems are copyrighted by their respective publishers, so it
- wouldn't be possible to distribute such a system as shareware (I
- think, but I'm not a copyright expert).
-
- Primary Keywords
-
- continue
-
- copy
-
- dec
-
- display
-
- drop
-
- endgame
-
- enter
-
- fight
-
- find
-
- for
-
- foreach
-
- frame
-
- getaction1
-
- getnum
-
- getstr
-
- goto
-
- gosub
-
- if
-
- inc
-
- join
-
- leave
-
- loadhint
-
- loadtext
-
- locate
-
- move
-
- on
-
- paint
-
- pause
-
- readtext
-
- restart
-
- restore
-
- return
-
- runscript1
-
- save
-
- savepcx1
-
- select
-
- setbody
-
- setbp
-
- stats
-
- stop
-
- teleport
-
- vanish
-
- viewfli1
-
- viewpcx
-
- voice
-
- vplay
-
- wait
-
- while
-
- write
-
- writeln
-
-
-
- Secondary Keywords
-
- if
-
- - then, elsif, else, endif
-
- expression
-
- - and, or, xor, not
-
- for
-
- - to, by, do, endfor
-
- foreach
-
- - do, endfor
-
- while
-
- - endwhile
-
- select, display
-
- - matching
-
- paint
-
- - screen, window
-
-
-
- Function Keywords
-
- abs
-
- action
-
- adjustments
-
- Day
-
- DaysInAMonth
-
- DefCaveBlk
-
- DefLandBlk
-
- DefPack
-
- DefSpookBlk
-
- DefStat
-
- DefWaterBlk
-
- fighting
-
- failure
-
- Hour
-
- HoursInADay
-
- keypress1
-
- max
-
- min
-
- Minute
-
- MinutesInAnHour
-
- Month
-
- MonthsInAYear
-
- MovesPerMinute
-
- pointx1
-
- pointy1
-
- random
-
- success
-
- SunSet
-
- SunRise
-
- version
-
- Year
-
- 1 Keywords marked with a (1) are new in version 4.0 of DCGAMES!
-